#include <iostream>
using namespace std;

//void Swap(int& left, int& right)
//{
//	int temp = left;
//	left = right;
//	right = temp;
//}
//void Swap(double& left, double& right)
//{
//	double temp = left;
//	left = right;
//	right = temp;
//}

//template <class T>
//void Swap(T& left, T& right)
//{
//	T temp = left;
//	left = right;
//	right = temp;
//}

//
//int main()
//{
//	int a = 2, b = 1;
//	cout << "Before Swap:" << endl;
//	cout << "a=" << a << endl;
//	cout << "b=" << b << endl;
//	Swap(a, b);
//	cout << "After Swap:" << endl;
//	cout << "a=" << a << endl;
//	cout << "b=" << b << endl;
//
//	cout << endl;
//
//	double c = 3.14, d = 2.33;
//	cout << "Before Swap:" << endl;
//	cout << "c=" << c << endl;
//	cout << "d=" << d << endl;
//	Swap(c, d);
//	cout << "After Swap:" << endl;
//	cout << "c=" << c << endl;
//	cout << "d=" << d << endl;
//
//	return 0;
//}

//int main()
//{
//	int a = 2, b = 1;
//	Swap(a, b);
//	return 0;
//}

//int main()
//{
//	int a = 2, b = 1;
//	Swap<int>(a, b);
//	return 0;
//}

//int main()
//{
//	int a = 2;
//	double b = 3.14;
//	//Swap(2, 3.14);
//	return 0;
//}

//int main()
//{
//	int a = 2, b = 1;
//	Swap<int>(a, b);
//	return 0;
//}

//template<class T>
//bool Less(T& x, T& y)
//{
//	return x < y;
//}
//
//int main()
//{
//	int a = 2, b = 1;
//	cout << Less(a, b) << endl;
//
//	int* pa = &a, *pb = &b;
//	cout << Less(pa, pb) << endl;
//
//	return 0;
//}

//template<class T>
//bool Less(T x, T y)
//{
//	return x < y;
//}
//
//template<>
//bool Less<int*>(int* px, int* py)
//{
//	return *px < *py;
//}
//
//int main()
//{
//	int a = 2, b = 1;
//	cout << Less(a, b) << endl;
//
//	int* pa = &a, * pb = &b;
//	cout << Less(pa, pb) << endl;
//
//	return 0;
//}

//template<class T>
//bool Less(const T& x,const T& y)
//{
//	return x < y;
//}
//
//template<>
//bool Less<int*>(int* const & px,int* const & py)
//{
//	return *px < *py;
//}
//
//template<>
//bool Less<const int*>(const int* const& px, const int* const& py)
//{
//	return *px < *py;
//}
//
//int main()
//{
//	int a = 2, b = 1;
//	cout << Less(a, b) << endl;
//
//	int* pa = &a, * pb = &b;
//	cout << Less(pa, pb) << endl;
//
//	return 0;
//}

//template <class T>
//class Stack
//{
//public:
//	Stack(size_t capacity = 4)
//	{
//		_array = new T[capacity];
//		_capacity = capacity;
//		_size = 0;
//	}
//private:
//	T* _array;
//	size_t _capacity;
//	size_t _size;
//};
//
//int main()
//{
//	Stack<int> s;
//	return 0;
//}

template<class T1, class T2>
class Data
{
public:
	Data() { cout << "Data<T1, T2>" << endl; }
private:
	T1 _d1;
	T2 _d2;
};

template <>
class Data<int, int>
{
public:
	Data() { cout << "Data<int, int>" << endl; }
private:
	int _d1;
	int _d2;
};

template <class T1>
class Data<T1, int>
{
public:
	Data() { cout << "Data<T1, int>" << endl; }
private:
	T1 _d1;
	int _d2;
};

template<class T1, class T2>
class Data<T1*, T2*>
{
public:
	Data() { cout << "Data<T1*, T2*>" << endl; }
private:
	T1* _d1;
	T2* _d2;
};

template<class T1, class T2>
class Data<T1&, T2&>
{
public:
	Data()
	{}

	Data(const T1& x, const T2& y) 
		:_d1(x)
		,_d2(y)
	{ 
		cout << "Data<T1&, T2&>" << endl; 
	}
private:
	const T1& _d1;
	const T2& _d2;
};

int main()
{
	Data<int*, int*> data1;
	Data<int&, int&> data2;

	return 0;
}